package 每日一题;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class No6Z字形变换 {

    /**
     * 将一个给定字符串根据给定的行数，以从上往下、从左到右进行 Z 字形排列。
     *
     * 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时，排列如下：
     * L   C   I   R
     * E T O E S I I G
     * E   D   H   N
     * 之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："LCIRETOESIIGEDHN"。
     */

    public static String convert(String s, int numRows) {
        //每一列 numRows个,然后 3->1 4->2 5->3 6->4 公式: numRows-2个空隙长度 numRows个长
        Map<Integer, List<Character>> map=new HashMap<>();
        int index=0;
        int count=numRows-2;//空隙长度
        //一组的长度为 index%(2*numRows-2)
        int oneSize=2*numRows-2;
        if(oneSize==0)
            return s;
        while (index<s.length()){
            int yu=index%oneSize;
            if(yu>=numRows){
                yu=numRows-(yu%numRows)-2;
            }
            /**
             * 如果大于满满的一行,就要特殊处理
             * yu%numRows 1 2 3 4 5
             * numRows-上面的 然后 得出加进去即可
             */
            List<Character> list = map.get(yu);
            if(list==null){
                List<Character> characterList=new ArrayList<>();
                characterList.add(s.charAt(index));
                map.put(yu,characterList);
            }else{
                list.add(s.charAt(index));
            }
            index++;

        }
        StringBuilder stringBuilder=new StringBuilder();
        for (Integer integer : map.keySet()) {
            map.get(integer).forEach(stringBuilder::append);
        }
        return stringBuilder.toString();
    }

    /**
     * 参考答案:不要去想公式那么复杂,到底部直接反着添加即可
     */
    public static String convertGood(String s, int numRows){
        if(numRows==1)
            return s;
        List<StringBuilder> list=new ArrayList<>();
        for (int i = 0; i < numRows; i++) {
            list.add(new StringBuilder());
        }
        char[] chars = s.toCharArray();
        int i=0;//原数
        int flag=1;//加数
        for (char c : chars) {
            list.get(i).append(c);//加入
            i+=flag;//自增
            if(i==numRows-1||i==0){//到底部了,或者到开头了
                flag=-flag;
            }
        }

        StringBuilder stringBuilder=new StringBuilder();
        for (int j = 0; j < list.size(); j++) {
            stringBuilder.append(list.get(j));
        }
        return stringBuilder.toString();
    }

    public static void main(String[] args) {
        String leetcodeishiring = convertGood("LEETCODEISHIRING", 4);
        System.out.println(leetcodeishiring);
    }

}
